package keywords2;

/**
 * @author shkstart
 * @date 2022/5/19 - 22:14
 */
/* * abstract关键字的使用
 * 1.abstract:抽象的
 * 2.abstract可以用来修饰的结构：类、方法
 *
 * 3. abstract修饰类：抽象类
 * 		> 此类不能实例化
 *      > 抽象类中一定有构造器，便于子类实例化时调用（涉及：子类对象实例化的全过程）
 *      (继承了抽象类的子类中通过super()或super(参数列表)调用抽象类中的构造方法.)
 *
 *      > 开发中，都会提供抽象类的子类，让子类对象实例化，完成相关的操作
 *
 *
 * 4. abstract修饰方法：抽象方法
 * 		4.1> 抽象方法只有方法的声明，没有方法体
 * 		4.2> 包含抽象方法的类，一定是一个抽象类。反之，抽象类中可以没有抽象方法的。

 * 	  对以上这句话的4.2的理解:
 * 	  * 因为类中的方法已经被抽象了，不可调用了，那么类也应该被抽象，类不可被实例化后，
 * 	    自然不能调用类中的方法
 *
 *      4.3> 若子类重写了父类中的所有的抽象方法后，此子类方可实例化
 *        若子类没有重写父类中的所有的抽象方法，则此子类也是一个抽象类，需要使用abstract修饰*/
public class AbstractTest {
    public static void main(String[] args) {

        Person person = new Student();
        person.walk();
//        一旦Person被抽象了，就不可实例化
//        Person person = new Person(); //右边就是实例化
//        person.eat();

    }
}


abstract class Creature {
    abstract public void breath();
}

abstract class Person extends Creature {
    String name;
    int age;

    public Person() {

    }
    public Person(String name,int age) {
        this.name = name;
        this.age = age;
    }

//    public void eat() {
//        System.out.println("人吃饭");
//    }

    abstract public void eat();

    public void walk() {
        System.out.println("人走路");
        eat();
    }

}


 class Student extends Person {
    public void eat() {
        System.out.println("不知道");
    }
    public void breath() {
        System.out.println("学生呼吸健康的空气");
    }

}



// 知识回顾:
// 当父类中的方法是抽象时，在子类中重写了此抽象的方法后。
// 将子类实例化后(多态性来体现),person.walk();walk里面有着eat();方法，
// 其中eat()方法调用的是在子类重写的eat()方法.